package com.cy.mybatis;

import com.cy.pj.sys.pojo.SysRole;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

！！详细的开启二级缓存代码和过程，可以参考网站：https://blog.csdn.net/u014749862/article/details/80297943
/**
Mybatis的本地缓存设计有2种--一级缓存("localCache")和二级缓存("second level cache")
(二级缓存的底层结构模式是一环套一环的，也叫"装饰模式"或"油漆工模式")

！！！执行逻辑：1.客户端发送了请求--2.先看二级缓存有没有数据(有缓存就不用看了直接返回缓存)--3.再看一级缓存有没有数据--
4.再看下分布式缓存Redis有没有数据--5.最后再访问数据库--6.返回数据给一级缓存，放一份--7.传给二级缓存，再放一份--
8.从二级缓存中拿到数据返回客户端
*/

/**
注意：SqlSession级别的一级缓存可以直接创建，而二级缓存
还要在sql映射里写上<cache......mybatis中的二级缓存(淘汰算法，刷新频率)>的代码，用来开启二级缓存
（更详细的过程在后面的day02）
*/

@SpringBootTest
public class CacheTests {

     @Autowired
     private SqlSessionFactory sessionFactory;

     @Test   //SqlSession级别的一级缓存
     void testFirstLevelCache(){
    //SqlSession是一级缓存
         SqlSession session=sessionFactory.openSession();
         String statement="com.cy.pj.sys.dao.SysRoleDao.selectRoles";
         List<SysRole> list1=session.selectList(statement);
         List<SysRole> list2=session.selectList(statement);//来自SqlSession的缓存
         System.out.println(list1==list2);
         session.close();
     }

    @Test    //mybatis中的二级缓存
    void testSecondLevelCache(){
          SqlSession session=sessionFactory.openSession();
        String statement="com.cy.pj.sys.dao.SysRoleDao.selectRoles";
        List<SysRole> list1=session.selectList(statement);
        session.close();
//一级缓存会清空缓存，二级缓存不和一级缓存共享数据
//此时会将list集合放入到二级缓存中
        list1.clear(); //清空list1
        session=sessionFactory.openSession();
        List<SysRole> list2=session.selectList(statement);
        System.out.println(list1==list2);
        System.out.println(list2.size());
        session.close();
    }
}
